import 'dart:io';

/// [FileSystemGateway]：文件系统操作网关接口。
///
/// 功能：
/// - 抽象出文件/文件夹的常见操作（查询、创建、删除、重命名）；
/// - 屏蔽具体平台实现，方便在本地、远程或 mock 环境中替换；
/// - 作为 [CreateService] / [DeleteService] 等服务的依赖，符合 **依赖倒置原则**。
///
/// 方法分组：
/// - **Query**：`existsFile` / `existsDir`
/// - **Create**：`createFile` / `createDir`
/// - **Delete**：`deleteFile` / `deleteDir`
/// - **Rename**：`renameFile` / `renameDir`
abstract class FileSystemGateway {
  // ────────────────────────────── Query ──────────────────────────────

  /// 判断文件是否存在。
  Future<bool> existsFile(String path);

  /// 判断文件夹是否存在。
  Future<bool> existsDir(String path);

  // ────────────────────────────── Create ─────────────────────────────

  /// 创建文件（若已存在则不重复创建）。
  Future<void> createFile(String path);

  /// 创建文件夹。
  ///
  /// - [recursive] 是否递归创建（默认 `true`）。
  Future<void> createDir(String path, {bool recursive = true});

  // ────────────────────────────── Delete ─────────────────────────────

  /// 删除文件。
  Future<void> deleteFile(String path);

  /// 删除文件夹。
  ///
  /// - [recursive] 是否递归删除（默认 `false`）。
  Future<void> deleteDir(String path, {bool recursive = false});

  // ────────────────────────────── Rename ─────────────────────────────

  /// 重命名文件（或移动到新路径）。
  Future<void> renameFile(String from, String to);

  /// 重命名文件夹（或移动到新路径）。
  Future<void> renameDir(String from, String to);
}

/// [LocalFileSystemGateway]：本地文件系统实现。
///
/// 使用 [dart:io] 提供的 [File] / [Directory] API 操作本地文件系统。
/// - 在实际桌面/移动端运行环境中使用；
/// - 可替换为远程实现（如调用后端 API）、内存实现（测试用）等。
class LocalFileSystemGateway implements FileSystemGateway {
  // ────────────────────────────── Query ──────────────────────────────

  @override
  Future<bool> existsFile(String path) => File(path).exists();

  @override
  Future<bool> existsDir(String path) => Directory(path).exists();

  // ────────────────────────────── Create ─────────────────────────────

  @override
  Future<void> createFile(String path) async {
    final file = File(path);
    if (!(await file.exists())) {
      await file.create(recursive: true);
    }
  }

  @override
  Future<void> createDir(String path, {bool recursive = true}) async {
    final dir = Directory(path);
    if (!(await dir.exists())) {
      await dir.create(recursive: recursive);
    }
  }

  // ────────────────────────────── Delete ─────────────────────────────

  @override
  Future<void> deleteFile(String path) => File(path).delete();

  @override
  Future<void> deleteDir(String path, {bool recursive = false}) =>
      Directory(path).delete(recursive: recursive);

  // ────────────────────────────── Rename ─────────────────────────────

  @override
  Future<void> renameFile(String from, String to) async {
    await File(from).rename(to);
  }

  @override
  Future<void> renameDir(String from, String to) async {
    await Directory(from).rename(to);
  }
}
